﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel;
using Fatec.ControleEstoque.Attributes;
using Fatec.ControleEstoque.Attributes.Security;
using System.Data;

namespace Fatec.ControleEstoque.Data.Model
{
    [Security(Role = "Produtos", Action = "All")]
    [MetadataType(typeof(ProdutosMetadata))]
    [Description("Relação de todos os produtos cadastrados no estoque.")]
    public partial class Produtos : IValidatable
    {
        public class ProdutosMetadata
        {
            [DisplayName("Código")]
            [ReadOnly(true)]
            [HideColumnIn(PageTemplate.Insert)]
            public object Id { get; set; }

            public object Nome { get; set; }

            [DisplayName("Unidade")]
            public object Produto_Unidade { get; set; }

            [DisplayName("Série")]
            public object Serie { get; set; }

            public object Marca { get; set; }

            public object Categoria { get; set; }

            [DisplayName("Estoque Mínimo")]
            public object Estoque_Minimo { get; set; }

            [DisplayName("Estoque Máximo")]
            public object Estoque_Maximo { get; set; }

            [DisplayName("Observação")]
            [HideColumnIn(PageTemplate.List)]
            public object Obs { get; set; }

            [DisplayName("Data de Cadastro")]
            [DisplayFormat(DataFormatString="{0:dd/MM/yyyy}")]
            [HideColumnIn(PageTemplate.Edit, PageTemplate.Insert)]
            public object Dt_Cadastro { get; set; }

            [ScaffoldColumn(false)]
            public object Estoque { get; set; }

            [ScaffoldColumn(false)]
            public object Terceiros { get; set; }
            
            [ScaffoldColumn(false)]
            public object Pedido_Produtos { get; set; }

        }


        #region IValidatable Members

        public bool Validate(EntityState state)
        {
            if (state != EntityState.Deleted)
            {
                if (Estoque_Maximo < 0)
                {
                    ExceptionMessage = "O estoque máximo não pode ser negativo!";
                }
                else if (Estoque_Minimo < 0)
                {
                    ExceptionMessage = "O estoque mínimo não pode ser negativo!";
                } 
                else if (Estoque_Maximo < Estoque_Minimo)
                {
                    ExceptionMessage = "O estoque máximo deve ser maior ou igual ao estoque mínimo!";
                }
                else if (Dt_Cadastro == null || Dt_Cadastro == DateTime.MinValue)
                {
                    Dt_Cadastro = DateTime.Today;
                }
            }
            return string.IsNullOrEmpty(ExceptionMessage);
        }

        public string ExceptionMessage{get;set;}
        
        #endregion
    }

}
